package com.atguigu.gulimall.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.gulimall.product.entity.CategoryEntity;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 商品服务
 * 添加缓存 redis
 *
 * @author huguangwei
 * @email huguangwei@gmail.com
 * @date 2021-07-24 12:55:06
 */
@CacheConfig(cacheNames = "category")
public interface CategoryService extends IService<CategoryEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 构建目录树
     * @Cacheable 缓存有数据时，从缓存获取；没有数据时，执行方法，并将返回值保存到缓存中
     * @Cacheable 一般在查询中使用
     * 1) cacheNames 指定缓存区，没有配置使用@CacheConfig指定的缓存区
     * 2) key 指定缓存区的key
     * 3) 注解的值使用SpEL表达式
     * eq ==
     * lt <
     * le <=
     * gt >
     * ge >=
     */
    @Cacheable(cacheNames = "categoryList",key="'list'")
    List<CategoryEntity> listWithTree();

    /**
     * 根据id删除菜单
     * @param asList
     */
    @CacheEvict(value="categoryList", key="'list'")
    void removeMenuByIds(List<Long> asList);

    /**
     * 取出查单路径
     * @param catelogId
     * @return
     */
    @Cacheable(cacheNames = "CatelogPath",key="'catelogPath'")
    Long[] findCatelogPath(Long catelogId);

    @CacheEvict(value="categoryList", key="'list'")
    void updateCascade(CategoryEntity category);

    @CacheEvict(value="categoryList", key="'list'")
    void saveMenu(CategoryEntity category);

    /**
     * 批量更新、更新完了同步缓存
     * @param asList
     */
    @CacheEvict(value="categoryList", key="'list'")
    void updateBatchMenusById(List<CategoryEntity> asList);
}

